이 질문에 이미 답변이 있습니다. 오버로드 된 연산자에 암시 적 변환이 없습니다. (2 답변) 7 년 전에 문을 닫았습니다. 기본 유형에 대한 간단한 래퍼를 작성 중이며 표준 연산자를 너무 많이 작성하지 않도록 노력하고 있습니다. 암시 적 형식 변환이 도움이되기를 바랐지만 그렇지 않습니다. 다음은 제거 된 예입니다. 구조체 Int { int _i; Int (int i = 0) : _i {i} {} Int 연산자 + (const Int & rhs) {return _i + rhs._i;} }; int main (int argc, char * argv []) { (무효) (Int (1) + 2); // 좋아 (무효) (2 + Int (1)); // 오류 : 이진 표현식에 대한 유효하지 않은 피연산자 ( 'int'및 'Int') } llvm을 사용하고 있습니다. 메인의 첫 번째 줄은 잘 컴파일됩니다. 두 번째는 오류를 발생시킵니다. 이제 두 번째 줄에서 2가 암시 적으로 Int (2)로 변환되고 operator +를 호출하기를 바랐습니다. 왜 그런 일이 일어나지 않습니까? 암시 적 변환이 첫 번째 줄에서 발생하는 이유는 무엇입니까?
2021-03-01 08:18:44
사용 가능한 유일한 operator +는 operator + (Int &) (이 인스턴스에 대해 Int의 암시 적 첫 번째 매개 변수가 있음)이기 때문에 첫 번째 줄에서 발생합니다. 두 번째 줄은 첫 번째 매개 변수가 int이고 작업을 시도하기 전에 변환해야한다는 단서가 없기 때문에 실패합니다 (Int :: operator +를 사용해야 함을 알지 못함). 운영자를 비회원 친구 기능 (http://ideone.com/YCf7wX)으로 설정하여 이러한 문제를 피할 수 있습니다. 구조체 Int { int _i; Int (int i = 0) : _i {i} {} friend Int 연산자 + (const Int & lhs, const Int & rhs); }; Int 연산자 + (const Int & lhs, const Int & rhs) { return lhs._i + rhs._i; } int main () { Int i; 나는 + 5; 5 + 나; 반환 0; } | 찾고있는 답변이 아닙니까? C ++ 연산자-키워드 암시 적 변환 태그가 지정된 다른 질문을 찾아 보거나 직접 질문하십시오.